#!/usr/bin/perl -w
#  FILE:   NoteGraph Version2
#  AUTHOR: Libardo Pantoja (wpantoja@unicauca.edu.co)
#  DATE:   18/08/2008
#
#  DESCRIPTION: Servicio NoteGraph - Vista Detallada

use DBI;
use CGI qw/:standard/;
use CGI::Session;

#------------------ MANEJO DE SESION  --------------------------------
my $session = CGI::Session->load() or die CGI::Session->errstr();
if ( $session->is_expired ) {

	#La sesion ha caducado
	print $session->header(), start_html(),    
	  p("Su sesion a caducado, recargue la pagina para crear una nueva"),
	  end_html();
	exit(0);
}
if ( $session->is_empty ) {

	#Se crea una nueva sesion
	$session = $session->new() or die $session->errstr;
	$session->expire("2h");
}
print $session->header(), start_html();

#----------------- MANEJO DE BASES DE DATOS-----------------------------
#open connection to Access Database
$dbName="KC_A222";
$dsn = 'dbi:mysql:'.$dbName;
$dbh = DBI->connect($dsn, 'knowcat', 'my4kc');

#-----------PREPARAR FICHERO DONDE SE DIBUJARA EN GRAFO
my $nameGrafo = "GrfRlc_" . $dbName . "_" . time();
my $pathGrafo = "tmp/";


dibujarNodos($pathGrafo, $nameGrafo);

crearMapaGrafo($pathGrafo, $nameGrafo);
#-------------------DATOS DE CIERRE DEL GRAFICO------------
#Cerrar base de datos y finalizar el html
$dbh->disconnect;
print end_html();
exit(0);
#FIN DEL SCRIPT

#-------------------------------------SUBRUTINAS---------------------------------
#--------------------------------------------------------------------------------

#----------------------------------Subrutina dibujarNodos------------------------
#DIBUJA NODOS DE DOCUMENTOS Y ANOTACIONES
sub dibujarNodos{
	#Recuperar parametros
	my ($pathGrafo, $nameGrafo) = @_;

	open( fileDOT, ">" . $pathGrafo . $nameGrafo . ".dot" );
	#Primera linea del grafo
	print fileDOT "digraph $nameGrafo {\n";
	#Caracteristicas del grafo
	print fileDOT "		node [ shape=box, width=\"0.5\", style=\"filled,rounded\", color=\"#ccccee\", fillcolor=\"#eeeeff\", fontcolor=\"#333399\", fontsize=8, fontname=\"Tahoma\"]\n";
	#Extraer informacion de la Base de Datos
	$sql = "select * from notegraph;";
	$sth =  $dbh->prepare($sql);
	$sth->execute || die "No se puede ejecutar la orden SQL";
	
	while ($row = $sth->fetchrow_hashref){
		#Elimina los espacios que tenga la anotacion
		$anotacion = eliminarEspacios($row->{anotacion});
		#Define el enlace entre el login y el documento
		print fileDOT "		\"$row->{login}\" -> \"$row->{doc}\" [style=\"dashed\",label=\"Anotacion\",fontsize=8, URL=\"javascript:void(0); alert('clic_arco'); $anotacion\"];\n";
		#Estilo del documento
		print fileDOT "		\"$row->{doc}\" [fillcolor=\"#eeeefc\", style=\"filled\", shape=box, URL=\"javascript:void(0); alert('Se_Supone_Que_Iria_Al_Documento'); $row->{tema}\"];\n";
		#Estilo del login
		print fileDOT "		\"$row->{login}\" [URL=\"javascript:void(0); alert('clic_en_usuario'); $row->{email}\"];\n";
	}
	
	print fileDOT "}";
	#Cerrar el fichero dot generado.
	close(fileDOT);
}

#----------------------------------Subrutina crearMapaGrafo------------------------
# Crea la imagen y el mapa del grafo a partir del fichero DOT con el programa dot de Graphviz
sub crearMapaGrafo{
	#Recuperar parametros
	my ($pathGrafo, $nameGrafo) = @_;
	
	#Borrar ficheros antiguiguos (mas de 24 horas) de grafos, imagenes y mapas
	system("find $pathGrafo -maxdepth 1 -mtime +1 \\( -name \"*.dot\" -o -name \"*.map\" -o -name \"*.gif\" \\) -exec rm -f {} \\;");
	
	# Crear la imagen y el mapa del grafo a partir del fichero DOT con el programa dot de Graphviz
	system("dot -Timap -o $pathGrafo$nameGrafo.map $pathGrafo$nameGrafo.dot & dot -Tgif -o $pathGrafo$nameGrafo.gif $pathGrafo$nameGrafo.dot");
	
	print h1( { -align => "center" }, "NoteGraph V0.2 - Vista Detallada" );
	
	print div(
		{ -align => "center" },
		img(
			{
				-style  => "border:0px;",
				-src    => "tmp/$nameGrafo.gif",
				-usemap => "#grfMap"
			}
		)
	);	
	print '<map name="grfMap">';
	open( fileMAP, "<" . $pathGrafo . $nameGrafo . ".map" );
	@lineas = <fileMAP>;
	my $cont = scalar @lineas;
	for ( $j = 1 ; $j < $cont ; $j++ ) {	
		@token = split( / /, $lineas[$j] );
		my $shape   = $token[0];
		my $href    = $token[1];
		my $onclick = $token[2];
		my $alt     = $token[3];
		my $coords = "$token[4],$token[5]";
		print "				<area href=\"$href\" alt=\"$alt\" title=\"$alt\"\n";
		print "						shape=\"$shape\" coords=\"$coords\"\n";
		print "						onclick=\"$onclick\">\n";
	}
	close(fileMAP);
	print '</map>';		
}

#----------------------------------Subrutina eliminarEspacios------------------------
#Elimina los espacios de una cadena y los sustituye por guion bajo
sub eliminarEspacios{
	#Recuperar parametros
	my ($cadena) = @_;
	# busque en cadena los espacios y sustituya por la raya baja 
	$cadena =~ s/\ /\&nbsp;/g;
	return $cadena;
}
